package com.xxx.springboot.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * 【布隆过滤器】1.布隆过滤器service
 * @author guwq
 * @since 2021/4/28
 */
@Slf4j
@Service
public class BloomFilterService {

    @Autowired
    private RedissonClient redissonClient;

    private String BLOOMFILTER_NAME = "USERID_LIST";

    private RBloomFilter<Long> bloomFilter;

    /**
     * 系统启动时，初始化bloomfilter
     */
    @PostConstruct
    private void initBloomFilter() {
        // 通过redissonClient创建bloomfilter
        this.bloomFilter = redissonClient.getBloomFilter(BLOOMFILTER_NAME);
        // 初始化bloomfilter，预计元素有10万个，误差3%
        // 误判率设置的越小，二进制向量占用的内存空间就越大，某个数据进行插入的时候经过的hash运算就更多，因为这样才能尽可能将数据保存在多个下标位置。
        this.bloomFilter.tryInit(100000L, 0.03);
        log.info("布隆过滤器初始化完成");
    }

    /**
     * 往集合里添加元素
     */
    public void put(Long id){
        this.bloomFilter.add(id);
    }

    /**
     * 使用bloomfilter判断元素是否在集合中
     * @param id
     * @return
     */
    public boolean checkContain(Long id){
        return this.bloomFilter.contains(id);
    }

}
